package novanok.com.tracktweet;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import twitter4j.UserMentionEntity;

public class MapReduceMenciones {
    private Map<String, Integer> menciones = new TreeMap<String, Integer>();
    private double FACTOR_MENCIONES = 0.2;

    private int limiteMenciones = 0;

    public MapReduceMenciones (){ }

    public void analizar( UserMentionEntity[] menciones ){
        synchronized (this.menciones) {
            for ( int i = 0; i < menciones.length; i++ ) {
                String valor = menciones[i].getScreenName().toUpperCase();

                if ( this.menciones.get(valor) != null )
                    this.menciones.put(valor, this.menciones.get(valor) + 1);
                else
                    this.menciones.put(valor, 1);
            }
        }

        this.purgar();
        this.actualizarLimite();
    }

    private synchronized void purgar(){
        synchronized (menciones) {
            if ( menciones.size() > 10 ) {
                List<String> remove = new LinkedList<String>();
                for (Map.Entry<String, Integer> v : menciones.entrySet())
                    if (v.getValue() == limiteMenciones)
                        remove.add(v.getKey());

                for (String s : remove)
                    menciones.remove(s);
            }
        }
    }

    private synchronized void actualizarLimite(){
        Map<String, Integer> lista = getMencionesOrdenados();

        if ( lista != null && lista.values().size() > 0 )
            this.limiteMenciones = ( int )( ( double ) lista.values().iterator().next() * FACTOR_MENCIONES );
    }

    public synchronized Map<String, Integer> getMencionesOrdenados(){
        synchronized(menciones) {
            return Comun.sortByValues(menciones);
        }
    }

    public void clear() {
        menciones.clear();
    }
}